#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：ITableData_copilot.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 17:42 
"""

from abc import ABCMeta, abstractmethod
from typing import Union, Dict

import pandas as pd


# 定义抽象接口
class ITableData(metaclass=ABCMeta):
	@abstractmethod
	def get_data(self) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
		"""获取数据的抽象方法，返回值为DataFrame或者字典类型，字典的值为DataFrame"""
		pass


# 定义数据库具体实现
class DataFromDatabase(ITableData):
	def get_data(self) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
		"""从数据库获取数据，返回值为DataFrame或者字典类型，字典的值为DataFrame"""
		pass


# 定义csv文件具体实现
class DataFromCSV(ITableData):
	def get_data(self) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
		"""从csv文件获取数据，返回值为DataFrame或者字典类型，字典的值为DataFrame"""
		pass


# 定义excel文件具体实现
class DataFromExcel(ITableData):
	def get_data(self) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
		"""从excel文件获取数据，返回值为DataFrame或者字典类型，字典的值为DataFrame"""
		pass


# 定义socket报文具体实现
class DataFromSocket(ITableData):
	def get_data(self) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
		"""通过socket获取报文，解析报文，返回值为DataFrame或者字典类型，字典的值为DataFrame"""
		pass


# 定义其他数据源具体实现
class DataFromOtherSource(ITableData):
	def get_data(self) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]:
		"""其他数据源获取数据，返回值为DataFrame或者字典类型，字典的值为DataFrame"""
		pass


class DataFetcherFactory:
	@staticmethod
	def create_fetcher(data_source, **kwargs) -> ITableData:
		if data_source == "database":
			return DataFromDatabase(**kwargs)
		elif data_source == "csv":
			return DataFromCSV(**kwargs)
		elif data_source == "excel":
			return DataFromExcel(**kwargs)
		else:
			raise ValueError("Unsupported data source")


# 使用数据库获取数据
database_fetcher = DataFetcherFactory.create_fetcher(
	"database", connection_string="your_connection_string"
)
database_data = database_fetcher.get_data()
print(database_data)

# 使用 CSV 文件获取数据
csv_fetcher = DataFetcherFactory.create_fetcher("csv", file_path="your_csv_file_path")
csv_data = csv_fetcher.get_data()
print(csv_data)

# 使用 Excel 文件获取数据
excel_fetcher = DataFetcherFactory.create_fetcher(
	"excel", file_path="your_excel_file_path", sheet_name="your_sheet_name"
)
excel_data = excel_fetcher.get_data()
print(excel_data)
